#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include "RingQueue.hpp"

using namespace wxd;

void* p_routine(void* args)
{
    RingQueue<int>* rq = static_cast<RingQueue<int>*>(args);
    int data = 1;
    while(true)
    {
        sleep(3);
        //获取任务

        //生产任务
        rq->Enqueue(data);
        std::cout<<"生产者生产任务 data = "<<data<<std::endl;
        data++;
    }

    return nullptr;
}
void* c_routine(void* args)
{
    RingQueue<int>* rq = static_cast<RingQueue<int>*>(args);
    int data;
    while(true)
    {
        //sleep(5);
        //消费任务
        rq->Pop(&data);
        //执行任务
        std::cout<<"消费者执行任务 data = "<<data<<std::endl;
    }

    return nullptr;
}

// int main()
// {

//     RingQueue<int>* rq = new RingQueue<int>(5);

//     //创建生产者消费者线程
//     pthread_t productor,consumer;
//     pthread_create(&productor,nullptr,p_routine,rq);
//     pthread_create(&consumer,nullptr,c_routine,rq);

//     sleep(11111);
//     pthread_join(productor,nullptr);
//     pthread_join(consumer,nullptr);

//     delete rq;

//     return 0;
// }


//测试基于阻塞队列的 多生产多消费 模型
int main()
{
    pthread_t p[3],c[2];

    RingQueue<int>* rq = new RingQueue<int>(5);   

    pthread_create(&p[0],nullptr,p_routine,rq);
    pthread_create(&p[1],nullptr,p_routine,rq);
    pthread_create(&p[2],nullptr,p_routine,rq);
    pthread_create(&c[1],nullptr,c_routine,rq);
    pthread_create(&c[0],nullptr,c_routine,rq);


    pthread_join(p[0],nullptr);
    pthread_join(p[1],nullptr);
    pthread_join(p[2],nullptr);
    pthread_join(c[1],nullptr);
    pthread_join(c[0],nullptr);

    return 0;
}